// JWT Token 管理工具

export interface UserInfo {
  id: number
  username: string
  nickname: string
  email: string
  sex: number
  role: number
}

// Token 相关常量
const TOKEN_KEY = 'jwt_token'
const USER_INFO_KEY = 'user_info'

/**
 * 获取存储的 JWT Token
 */
export const getToken = (): string | null => {
  try {
    return localStorage.getItem(TOKEN_KEY)
  } catch (error) {
    console.error('获取 token 失败:', error)
    return null
  }
}

/**
 * 设置 JWT Token
 */
export const setToken = (token: string): void => {
  try {
    localStorage.setItem(TOKEN_KEY, token)
  } catch (error) {
    console.error('设置 token 失败:', error)
  }
}

/**
 * 清除 JWT Token
 */
export const removeToken = (): void => {
  try {
    localStorage.removeItem(TOKEN_KEY)
  } catch (error) {
    console.error('清除 token 失败:', error)
  }
}

/**
 * 获取用户信息
 */
export const getUserInfo = (): UserInfo | null => {
  try {
    const userInfoStr = localStorage.getItem(USER_INFO_KEY)
    if (userInfoStr) {
      return JSON.parse(userInfoStr) as UserInfo
    }
    return null
  } catch (error) {
    console.error('获取用户信息失败:', error)
    return null
  }
}

/**
 * 设置用户信息
 */
export const setUserInfo = (userInfo: UserInfo): void => {
  try {
    localStorage.setItem(USER_INFO_KEY, JSON.stringify(userInfo))
  } catch (error) {
    console.error('设置用户信息失败:', error)
  }
}

/**
 * 清除用户信息
 */
export const removeUserInfo = (): void => {
  try {
    localStorage.removeItem(USER_INFO_KEY)
  } catch (error) {
    console.error('清除用户信息失败:', error)
  }
}

/**
 * 检查是否已登录
 */
export const isLoggedIn = (): boolean => {
  const token = getToken()
  const userInfo = getUserInfo()
  return !!(token && userInfo)
}

/**
 * 清除所有认证信息
 */
export const clearAuth = (): void => {
  removeToken()
  removeUserInfo()
}

/**
 * 检查 Token 是否过期
 * 如果 Token 包含过期时间信息，可以在这里解析并检查
 */
export const isTokenExpired = (token?: string): boolean => {
  try {
    const currentToken = token || getToken()
    if (!currentToken) {
      return true
    }

    // 解析 JWT Token 的 payload 部分
    const parts = currentToken.split('.')
    if (parts.length !== 3) {
      return true
    }

    const payload = JSON.parse(atob(parts[1]))
    const currentTime = Math.floor(Date.now() / 1000)
    
    // 检查是否有过期时间字段 exp
    if (payload.exp) {
      return currentTime >= payload.exp
    }

    // 如果没有过期时间信息，假设 Token 有效
    return false
  } catch (error) {
    console.error('检查 Token 过期失败:', error)
    return true
  }
}

/**
 * 获取 Token 中的用户信息
 */
export const getTokenPayload = (token?: string): any | null => {
  try {
    const currentToken = token || getToken()
    if (!currentToken) {
      return null
    }

    const parts = currentToken.split('.')
    if (parts.length !== 3) {
      return null
    }

    return JSON.parse(atob(parts[1]))
  } catch (error) {
    console.error('解析 Token 失败:', error)
    return null
  }
}